package main

import (
	"fmt"
	"io"
	"os"
	"os/exec"

	"github.com/creack/pty"
)

func main() {
	// 创建伪终端
	master, slave, err := pty.Open()
	if err != nil {
		panic(err)
	}
	//defer master.Close()
	//defer slave.Close()

	// 创建外部命令对象
	cmd := exec.Command("ls", "-l")

	// 设置伪终端的读取和写入端口
	cmd.Stdout = slave
	cmd.Stdin = slave
	cmd.Stderr = os.Stderr

	// 启动外部命令
	if err := cmd.Start(); err != nil {
		panic(err)
	}

	// 从伪终端读取命令的输出并打印
	go func() {
		io.Copy(os.Stdout, master)
	}()

	// 等待命令执行完成
	if err := cmd.Wait(); err != nil {
		panic(err)
	}

	fmt.Println("Command finished.")
	output, err := cmd.Output()
	if err != nil {
		panic(err)
	}

	fmt.Println(string(output))
}
